package main;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;

/**
 * 1、工厂模式
 *      当2个之间具有依赖关系时，最常见的嘴阀就是一个类通过new关键字去定义另一个类的对象，然后使用
 *      但是这种方式是强耦合的关系，我们应该避免
 * 此时我们考虑多定义一个中间类（工厂类）
 * 当A中需要类B的对象时候，不在A类中直接创建对象
 * 而是在中间类中定义方法啊创建，然后A再调用工厂类提供的方法获取B对象
 *
 * 实现A和B的代码解耦
 *
 * 简单工厂：
 *      是其他两个工厂模式的入门，不属于23种设计模式之一
 * 简单工厂模式所涉及到角色：
 *      1、抽象产品
 *      2、具体的产品实现
 *      3、工厂（负责产生对应的产品）
 *
 *
 *
 */

public class Demo03 {
    public static void main(String[] args) {
        String userDaoType = main.XMLUtil.getUserDaoType();
        main.UserDao userDao =  main.UserDaoFactory.getUserDao(userDaoType);
        userDao.getIUserInfo();

    }
}

//抽象产品角色
interface UserDao{
    //抽象的业务方法
    public void getIUserInfo();
}

//具体的产品类
class JdbcUserDao implements main.UserDao {

    @Override
    public void getIUserInfo() {
        System.out.println("通过jdbc连接数据库，获取用户信息");
    }
}

class C3p0UserDao implements main.UserDao {

    @Override
    public void getIUserInfo() {
        System.out.println("通过c3p0连接池数据库，获取用户信息");
    }
}

//简单工厂类
class UserDaoFactory{
    public static main.UserDao getUserDao(String type){
        main.UserDao userDao = null;
        if ("jdbcType".equals(type)){
            userDao = new main.JdbcUserDao();
        }else if("c3p0Type".equals(type)){
            userDao = new main.C3p0UserDao();
        }
        return userDao;
    }
}

class XMLUtil {
    public static String getUserDaoType() {
        try {//创建文档对象
            DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = dFactory.newDocumentBuilder();
            Document doc; doc = builder.parse(new File("src/main/resources/databaseConfig.xml"));
            //获取包含图表类型的文本节点
            NodeList nl = doc.getElementsByTagName("daoType");
            Node classNode = nl.item(0).getFirstChild();
            String daoType = classNode.getNodeValue().trim();
            return daoType;
        }catch(Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}
